# -*- coding:utf-8 -*-
#
#  通达信日线'sh/lday/'，'sz/lday/'里面文件提取为csv文件。
#  通达信的日线数据格式如下：
#   每32个字节为一天数据每4个字节为一个字段，每个字段内低字节在前
#   00 ~ 03 字节：年月日, 整型
#   04 ~ 07 字节：开盘价*100， 整型
#   08 ~ 11 字节：最高价*100, 整型
#   12 ~ 15 字节：最低价*100, 整型
#   16 ~ 19 字节：收盘价*100, 整型
#   20 ~ 23 字节：成交额（元），float型
#   24 ~ 27 字节：成交量（股），整型
#   28 ~ 31 字节：（保留）

import os
import os.path
import struct
import time, datetime


def tdx2csv(source, fname, target):
    ifile = open(source + fname, 'rb')
    buf = ifile.read()
    ifile.close()

    ofile = open(target + fname + '.csv', 'w')
    num = len(buf)
    no = int(num / 32)  # file number
    b = 0
    e = 32
    line = ''
    linename = str('date') + ',' + str('open') + ',' + str('high') + ',' + str('low') + ',' + str('close') + ',' \
               + str('vol') + ',' + str('amount') + '' + '\n'
    # print line
    ofile.write(linename)
    for i in range(no):
        a = struct.unpack('IIIIIfII', buf[b:e])  # 按IIIIIfII读取buf[0:32],从start=0,end=32,字节
        line = str(a[0]) + ',' + str(a[1] / 100.0) + ',' + str(a[2] / 100.0) + ',' + str(a[3] / 100.0) + ',' \
               + str(a[4] / 100.0) + ',' + str(a[6]) + ',' + str(a[5] / 10.0) + '' + '\n'
        # print line
        # print("a[0]=%s" %a[0])
        ofile.write(line)
        b += 32
        e += 32
    ofile.close()


if __name__ == "__main__":
    source_dir = 'H:/NewTdxVip2020/vipdoc/sz/lday/'  # 'sh/lday/'
    target_dir = 'csv/'
    listfile = os.listdir(source_dir)
    for f in listfile:
        print('unpack file from %s%s to %s ' % (source_dir, f, target_dir))
        tdx2csv(source_dir, f, target_dir)
    print('Done!')
